package eSchool.Utils;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class DateTime {
    Date data;
    
    /**
     * Constructor que inicializa os atributos do objecto por defeito.
     */
    public DateTime() {
        data= new Date();
    }
    
    /**
     * Retorna o ano da data representada por este objecto DateTime.
     * <p>
     * @return  int, ano da data representada.
     */
    public int getYear(){
        GregorianCalendar cal= new GregorianCalendar();
        cal.setTime(data);
        return cal.get(Calendar.YEAR);
    }
    
    /**
     * Retorna o m�s representado por este objecto DateTime.
     * <p>
     * @return  int, m�s da data representada.
     */
    public int getMonth(){
        GregorianCalendar cal= new GregorianCalendar();
        cal.setTime(data);
        return cal.get(Calendar.MONTH);
    }
    
    /**
     * Retorna o dia do m�s representado por este objecto DateTime.
     * <p>
     * @return  int, dia do m�s da data representada.
     */
    public int getDayOfMonth(){
        GregorianCalendar cal= new GregorianCalendar();
        cal.setTime(data);
        return cal.get(Calendar.DAY_OF_MONTH);
    }
      
    /**
     * Adiciona um valor � data corrente, consoante o parametro passado.
     * <p>
     * @Param int field, identifica o tipo de valor que deve ser adicionado
     * @Param int amount, valor do a adicionar � data
     * @return  int, dia do m�s da data representada.
     */
    public DateTime add(int field, int amount){
        GregorianCalendar cal = new GregorianCalendar();
        cal.setTime(data);
        cal.add(field, amount);
        data.setTime(cal.getTimeInMillis());
        return this;
    }
    
    public static DateTime add(DateTime dt, int field, int amount){
        DateTime dt2 = new DateTime();
        dt2.set(dt.getYear(), dt.getMonth(), dt.getDayOfMonth());
        
        GregorianCalendar cal = new GregorianCalendar();
        cal.setTime(dt2.getDate());
        cal.add(field, amount);
        dt2.getDate().setTime(cal.getTimeInMillis());
        return dt2;
    }
    
    /**
     * Permite a altera��o de qualquer parte da data ou hora consoante o indicado no parametro field
     * <p>
     * @Param int field, identifica o tipo de valor que deve ser adicionado
     * @Param int amount, valor do a adicionar � data
     * @return  DateTime, data representada pelo objecto.
     */
    public DateTime set(int field, int value){
        GregorianCalendar cal = new GregorianCalendar();
        cal.setTime(data);
        cal.set(field, value);
        data.setTime(cal.getTimeInMillis());
        return this;
    }
    
    /**
     * Permite a especifica��o do ano, m�s e hora.
     * <p>
     * @Param int year, ano da data
     * @Param int month, m�s da data
     * @Param int date, dia da data
     * @return  DateTime, data representada pelo objecto.
     */
    public DateTime set(int year, int month, int date){
        GregorianCalendar cal = new GregorianCalendar();
        cal.setTime(data);
        cal.set(year, month, date);
        data.setTime(cal.getTimeInMillis());
        return this;
    }
        
    /**
     * Permite a especifica��o do ano, m�s e hora.
     * <p>
     * @Param int year, especifica o ano da data
     * @Param int month, especifica o m�s da data
     * @Param int date, especifica o dia da data
     * @Param int hourOfDay, especifica a hora da data
     * @Param int minute, especifica o minuto da data
     * @return  DateTime, data representada pelo objecto.
     */
    public DateTime set(int year, int month, int date, int hourOfDay, int minute){
        GregorianCalendar cal = new GregorianCalendar();
        cal.setTime(data);
        cal.set(year, month, date, hourOfDay, minute);
        data.setTime(cal.getTimeInMillis());
        return this;
    }
    
    /**
     * Permite a especifica��o do ano, m�s e hora.
     * <p>
     * @Param int year, especifica o ano da data
     * @Param int month, especifica o m�s da data
     * @Param int date, especifica o dia da data
     * @Param int hourOfDay, especifica a hora da data
     * @Param int minute, especifica o minuto da data
     * @Param int second, especifica os segundos da data
     * @return  DateTime, data representada pelo objecto.
     */
    public DateTime set(int year, int month, int date, int hourOfDay, int minute, int second){
        GregorianCalendar cal = new GregorianCalendar();
        cal.setTime(data);
        cal.set(year, month, date, hourOfDay, minute, second);
        data.setTime(cal.getTimeInMillis());
        return this;
    }

     public DateTime set(String date, String separator){
        GregorianCalendar cal = new GregorianCalendar();
        cal.setTime(data);
        cal.set(Integer.parseInt(date.split(separator)[2]), Integer.parseInt(date.split(separator)[1]), Integer.parseInt(date.split(separator)[0]));
        data.setTime(cal.getTimeInMillis());
        return this;
    }

    
    
    /**
     * retorna um objecto do tipo Date com a representa��o da data
     * <p>
     * @return Date, data representada pelo objecto.
     */
    public Date getDate(){
        return data;
    }
    
    /**
     * Compara dois objectos do tipo DateTime, retorna -1 se for menor, 0 se for igual e 1 se for maior
     * <p>
     * @return int, retorna -1 se for menor, 0 se for igual e 1 se for maior
     */
    public int compareTo(DateTime anotherDate){
        return this.data.compareTo(anotherDate.getDate());
    }
    
    /**
     * retorna uma String que representa um objecto
     * <p>
     * @return String, representa��o do objecto em String
     */
    public String toString(){
        GregorianCalendar cal= new GregorianCalendar();
        cal.setTime(data);
        return cal.get(Calendar.DAY_OF_MONTH) + "/" +  cal.get(Calendar.MONTH) + "/" + cal.get(Calendar.YEAR);
    }
}
